//泛型,用于我们对不确定的值进行预定义

//泛型函数
let home:<T>(str:T)=>T=(str)=>{
  return str;
}
home<string>('三笠');


//泛型类
class Mymethod<T> {
  name:T;
  age:T;
  constructor(name:T,age:T){
    this.name=name
    this.age=age;
  }
}
//不规定类型只能写一种类型
new Mymethod('三笠','艾伦');
//规定类型为联合类型
new Mymethod<string|number>('弗洛克',123);


//泛型接口
interface Inf<T> {
  name:T
}
let obj:Inf<string> = {
  name:'艾伦'
}

//泛型接口

interface Icla<T> {
  name:T
}

//接口约束类
class Person implements Icla<string> {
  name='我的'
  sayname<S>(num:S):S {
    return num;
  }
}
let p = new Person();
p.sayname<string>('字符串');

//泛型约束

//对一个泛型的类型约束，意思就是继承了这两个类型
class Son<S extends string|number>{

}

//这里我们现在只可以传入string或number其他类型都不可以
let s = new Son<string|number>();


//泛型约束接口
interface IA<T extends string|number> {
  name:T
  age:T
}
//这个时候我们给类型的时候就只能是string或number
let obj1:IA<string|number> = {
  name:'字符',
  age:123
}


